import { mutableHandler, ReactiveFlags } from "./baseHandler";

/**
 * @date 2025-07-30 20:48:04
 * @desc 判断传入的target是否为对象类型
 * @param {*} obj
 * @returns {boolean} 是否为对象
 */
function isObject(obj: any) {
  return Object.prototype.toString.call(obj) === "[object Object]";
}

// 用于记录代理后的结果，使得代理对象可以复用
const reactiveMap = new WeakMap();

/**
 * @date 2025-07-30 21:02:37
 * @desc 创建代理对象并返回
 */
function createReactiveObj(target: any) {
  // 如果不是对象类型 直接返回本身
  if (!isObject(target)) {
    return target;
  }

  if (target[ReactiveFlags.IS_REACTIVE]) {
    // 如果target已经是代理对象，则一定有属性__v_isReactive，代理对象直接返回（防止将代理对象再次代理）
    return target;
  }

  // 如果存在代理对象时，直接取代理对象返回而不是重新创建
  const exitsProxy = reactiveMap.get(target);
  if (exitsProxy) return exitsProxy;
  // 创建代理对象后返回
  const proxy = new Proxy(target, mutableHandler);
  // 根据对象缓存代理后的结果
  reactiveMap.set(target, proxy);
  return proxy;
}

/**
 * @date 2025-07-30 20:43:19
 * @desc 实现简单的reactive函数，当传入对象时返回代理后的对象
 * @param {*} target
 * @author nine
 */
export function reactive(target: any) {
  return createReactiveObj(target);
}
